# -*- coding: utf-8 -*-
# @Time    : 2024/7/12 10:13
# @Author  : yujiahao
# @File    : 18_fastapi_form.py
# @description:表单数据


# 接收的不是 JSON，而是表单字段时，要使用 Form,要使用表单需要预先安装 pip install python-multipart。
# https://github.com/Kludex/python-multipart

# 从 fastapi 导入 Form
from fastapi import FastAPI, Form

app = FastAPI()

@app.post("/login/")
async def login(username: str = Form(), password: str = Form()):
    """
    创建表单（Form）参数的方式与 Body 和 Query 一样。

    对于下面的例子：该规范要求字段必须命名为 username 和 password，并通过表单字段发送，不能用 JSON。

    使用 Form 可以声明与 Body （及 Query、Path、Cookie）相同的元数据和验证。
    Form 是直接继承自 Body 的类。
    声明表单体要显式使用 Form ，否则，FastAPI 会把该参数当作查询参数或请求体（JSON）参数。

    技术细节：
    - 表单数据的「媒体类型」编码一般为 application/x-www-form-urlencoded。
    - 但包含文件的表单编码为 multipart/form-data。文件处理详见下节。
    - 编码和表单字段详见 MDN Web 文档的 POST小节。

    警告：
    - 可在一个路径操作中声明多个 Form 参数，但不能同时声明要接收 JSON 的 Body 字段。
    - 因为此时请求体的编码是 application/x-www-form-urlencoded，不是 application/json。
    - 这不是 FastAPI 的问题，而是 HTTP 协议的规定。
    """
    # 这里可以添加验证逻辑，例如检查用户名和密码是否正确
    if username == "admin" and password == "secret":
        return {"message": "Login successful"}
    else:
        return {"message": "Invalid credentials"}
